- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Графические интерфейсы пользователя Java - Тимур Сергеевич Машнин
Шрифт:
Интервал:
Закладка:
Далее вы создаете компонент JSpinner на основе модели данных.
К компоненту присоединяется слушатель изменения значения поля, в обработчике которого вы можете получить новое значение форматированного поля ввода и работать с ним.
Компонент JSpinner напрямую поддерживает один тип прослушивателя событий – это ChangeListener.
Этот слушатель уведомляется, когда вызывается метод commitEdit, сообщая, что значение счетчика изменилось.
По умолчанию, этот метод вызывается при нажатии стрелок для перемещения по различным значениям.
Предположим, вы хотите позволить пользователю ввести свое значение и хотите получить это значение для дальнейшей обработки.
Для этого вам нужно обратиться к вспомогательному классу компонента JSpinner.
Для каждой из моделей данных компонента JSpinner, доступен вспомогательный класс ListEditor, DateEditor, NumberEditor, которые расширяют базовый класс DefaultEditor.
В то время как модель данных позволяет контролировать то, что выбирается для компонента, редакторы позволяют контролировать то, как отображать и редактировать каждое выбираемое значение.
Поэтому вы извлекаете из спиннера редактор, а из редактора извлекаете объект поля ввода.
Затем присоединяете к полю ввода слушатель изменения его свойства, в обработчике которого вы можете получить введенное пользователем значение после нажатия им клавиши Enter или потери полем ввода фокуса.
Также вы можете использовать редактор спинера и соответственно поле ввода для контроля над отображением значений спиннера.
Здесь мы выравниваем значение по центру поля ввода.
Если вы хотите отображать в спиннере даты, вам нужно использовать модель данных SpinnerDateModel.
Здесь в конструкторе модели мы указываем текущее значение, начальное и конечное значения последовательности дат, ограничивая диапазон 100 годами.
Последним аргументом конструктора вы указываете шаг изменения даты.
Соответственно, в слушателе изменения свойства поля ввода, вы должны проверять, является ли вводимое значение объектом класса Date.
Если вы хотите изменить формат отображения даты, вам нужно создать экземпляр редактора, указав в конструкторе шаблон форматирования.
Затем вы должны установить этот редактор для спиннера методом setEditor.
Модель данных SpinnerNumberModel обеспечивает выбор номера из открытого или закрытого диапазона значений.
Это число может быть любым из подклассов класса Number, включая объекты Integer и Double.
Здесь в конструкторе модели мы также указываем текущее значение, начальное и конечное значения последовательности чисел, указывая шаг изменения значения.
В слушателе изменения свойства поля ввода, вы должны проверять, является ли вводимое значение объектом класса Number.
Если вы хотите изменить формат отображения чисел, вам нужно создать экземпляр редактора, указав в конструкторе шаблон форматирования.
Затем вы должны установить этот редактор для спиннера методом setEditor.
Компонент JSlider представляет собой ползунок, с помощью которого пользователь может выбрать целое значение в указанном диапазоне.
Компонент JSlider создается с помощью конструктора, в котором можно указать его ориентацию, минимальное и максимальное значения диапазона и первоначальное значение ползунка.
Рядом с линейкой ползунка можно разметить шкалу со штрихами, отстоящими друг от друга на расстояние, устанавливаемое методом setMajorTickSpacing.
После определения расстояния шкала отображается методом setPaintTicks (true).
К штрихам можно добавить отображение числовых значений методом setPaintLabels (true).
Между штрихами можно отобразить более мелкие штрихи методом setMinorTickSpacing.
Если применить метод setSnapToTicks (true), то ползунок будет останавливаться только против штрихов.
Основную линейку ползунка можно убрать методом setPaintTrack (false), оставив только шкалу со штрихами.
По умолчанию числовые значения в шкале ставятся против каждого штриха.
Методом createStandardLabels можно изменить это правило, задав другой шаг расстановки чисел на шкале и другой начальный отсчет.
Затем эту таблицу нужно установить на шкале методом setLabelTable.
Можно создать свою таблицу меток штрихов, с помощью хэш-таблицы Hashtable, поместив в нее против каждого значения штриха свою метку.
После этого эта таблица устанавливается методом setLabelTable для ползунка.
В этом примере мы создаем ползунок и с помощью него динамически изменяем размеры кнопки.
JTree
Класс JTree представляет компонент Swing для отображения древовидных данных.
Дерево содержит один корневой объект root, далее размещаются его потомки узловые объекты node, имеющие своих потомков и одного предка parent.
На самом нижнем уровне расположены листья leaf – узлы, не имеющие потомков.
Как и все Swing компоненты, компонент JTree использует отдельный объект модели для хранения и представления данных, которые он отображает.
Большинство компонентов Swing автоматически создают этот объект модели, и вам не нужно явно с ним работать.
Однако компонент JTree отображает данные, которые намного сложнее, чем данные типичного компонента Swing.
Когда вы работаете с JTree, вы должны явно использовать объект модели.
Объект JTree создается с помощью конструктора, который может быть пустым, и тогда вам нужно установить модель данных методом setModel.
Следующие три конструктора создают дерево без объекта корневого узла.
Полноценное дерево вы можете создать, передав в конструктор модель данных, реализующую интерфейс TreeModel.
Существует класс DefaultTreeModel, реализующий этот интерфейс.
Объект этого класса создается на основе корневого узла, который содержит все остальные узлы.
Поэтому для дерева JTree предусмотрен конструктор, который создает дерево сразу на основе корневого узла.
Корневой узел – это объект, реализующий интерфейс TreeNode.
Существует класс DefaultMutableTreeNode, реализующий этот интерфейс.
Поэтому самый простой способ построения дерева, это создать корневой узел DefaultMutableTreeNode, затем добавить к нему дочерние узлы, а затем добавить дочерние узлы к каждому из них по мере необходимости.
Как правило, дерево помещается в панель с прокруткой, чтобы развернутое дерево поместилось во фрейм.
При этом указывается число строк, помещающихся в панели, с помощью метода setVisibleRowCount.
Здесь мы создали дерево строк.
Однако можно создать дерево произвольных объектов.
Одно условие – объект должен иметь метод toString, возвращающий строку, которая и будет отображаться на экране в дереве.
По умолчанию, узлы дерева имеют режим множественного выбора, то есть их можно выбирать с нажатой клавишей Ctrl.
Для того чтобы ограничить выбор одним узлом, нужно получить модель выбора дерева и установить для этой модели режим выбора одного узла.
К дереву можно присоединить слушателя выбора узла, в обработчике которого можно получить объект выбранного узла с помощью метода getLastSelectedPathComponent.
И дальше уже с этим объектом работать.
Вы также можете редактировать текст в каждом узле, вызвав метод setEditable (true) для дерева.
В этом случае после редактирования узла, дерево будет отображать новую строку и в обработчике слушателя TreeSelectionListener, метод getLastSelectedPathComponent будет возвращать уже измененный узел.
Так как при редактировании мы изменяем модель данных дерева, отследить редактирование узла мы можем с помощью слушателя изменений модели данных дерева.
В обработчике событий treeNodesChanged этого слушателя, мы с помощью метода getTreePath получаем родителя измененных узлов.
И если это не корневой узел, берем первый дочерний узел, который мы

